/**
 * @file tsk_bitmap.c
 * @brief tskp库 - 位图管理模块实现文件
 * @details
 * 本文件实现了tskp任务调参库的位图管理功能，包括位图初始化、设置、清除、测试等操作。
 * 位图用于任务ID等资源的高效分配与管理，适合嵌入式、实时系统下的静态资源管理场景。
 *
 * 作者：小傲（个人开发）
 * 邮箱：2655640770@qq.com
 * 版权声明：开源公开，欢迎建议与反馈
 * 日期：2025-09-11
 */

#include "tsk_Bitmap.h"

#ifdef _TSK_TSKP_

/**
 * @brief        // 位图初始化
 * @param[in]    // tsk_Bitmap : 指向位图结构体的指针
 * @return       // bool : true表示初始化成功
 * @note         // data为数组类型，不使用动态内存分配
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_Bitmap_Init(tsk_Bitmap_t* tsk_Bitmap){
    for(int i = 0; i < TSK_TASK_ID_BITMAP_SIZE; i++){
        tsk_Bitmap->data[i] = 0;
    }
    tsk_Bitmap->size = TSK_TASK_ID_BITMAP_SIZE;
    return true;
}

/**
 * @brief        // 设置一个位为1
 * @param[in]    // tsk_Bitmap : 指向位图结构体的指针
 * @param[in]    // index      : 要设置的位索引
 * @return       // bool : true表示设置成功,false表示越界
 * @note         // 索引从0开始，最大为size*32-1
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_Bitmap_set(tsk_Bitmap_t* tsk_Bitmap,size_t index){
    if(index >= (tsk_Bitmap->size*32)){
        return false;
    }
    size_t pos=index/32;
    size_t bit=index%32;
    tsk_Bitmap->data[pos]|=(1U<<bit);
    return true;
}

/**
 * @brief        // 清除一个位为0
 * @param[in]    // tsk_Bitmap : 指向位图结构体的指针
 * @param[in]    // index      : 要清除的位索引
 * @return       // bool : true表示清除成功,false表示越界
 * @note         // 索引从0开始，最大为size*32-1
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_Bitmap_clear(tsk_Bitmap_t* tsk_Bitmap,size_t index){
    if(index >= (tsk_Bitmap->size*32)){
        return false;
    }
    size_t pos=index/32;
    size_t bit=index%32;
    tsk_Bitmap->data[pos]&=~(1U<<bit);
    return true;
}

/**
 * @brief        // 判断某个位是否为1
 * @param[in]    // tsk_Bitmap : 指向位图结构体的指针
 * @param[in]    // index      : 要判断的位索引
 * @return       // bool : true表示该位为1,false表示为0或越界
 * @note         // 索引从0开始，最大为size*32-1
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_Bitmap_test(tsk_Bitmap_t* tsk_Bitmap, size_t index){
    if(tsk_Bitmap == NULL || index >= (tsk_Bitmap->size * 32)){
        return false;
    }
    size_t pos = index / 32;
    size_t bit = index % 32;
    return (tsk_Bitmap->data[pos] & (1U << bit)) != 0;
}

#endif // _TSK_TSKP_
